//////////////////////////////////////////////////////////////////////////

#ifndef _INNERPACKET_H_
#define _INNERPACKET_H_

//////////////////////////////////////////////////////////////////////////

#ifndef _PACKET_H_
#include "packet.h"
#endif

//////////////////////////////////////////////////////////////////////////


/** Class for inner network packets
*
*  @author   Roman Pasechnik
*  @since    Jul 04th, 2009
*  @updated  Oct 10th, 2009
*/
class InnerPacket : public Packet
{
//////////////////////////////////////////////////////////////////////////

public:

//////////////////////////////////////////////////////////////////////////


    /** Packet codes */
    enum PacketCode
    {
        INVALID,

        CONFIRM,
        CONNECT,
        REGULAR     // Packets with user and server data
    };


//////////////////////////////////////////////////////////////////////////


    /** Constructor */
    InnerPacket ( const Packet& _packet,
                  PacketCode _packetCode = INVALID );


    /** Constructor */
    InnerPacket ( const char* _data = NULL,
                  size_t _length = 0,
                  PacketCode _packetCode = INVALID );


////////////////////////////////////////////////////////////////////////////////


    /** Get packet code */
    PacketCode GetPacketCode() const;


    /** Get packet code */
    void SetPacketCode( PacketCode _code );


////////////////////////////////////////////////////////////////////////////////


    /** Move packet code to data */
    void PackCode();


    /** Extract packet code from data */
    PacketCode UnPackCode();


////////////////////////////////////////////////////////////////////////////////

private:

////////////////////////////////////////////////////////////////////////////////


    /** ConnectionPacket code */
    PacketCode m_PacketCode;


//////////////////////////////////////////////////////////////////////////
};


//////////////////////////////////////////////////////////////////////////

#endif

//////////////////////////////////////////////////////////////////////////
